#include <iostream>
#include <string>
#include <string>
#include <unordered_map>
#include <chrono>
#include <sw/redis++/redis++.h>
#include "utill.hpp"

using namespace std;

// set get
void test1(sw::redis::Redis &redis)
{
    redis.flushall();

    redis.set("key1", "111");
    redis.set("key2", "222");
    redis.set("key3", "333");

    auto val1 = redis.get("key1");
    auto val2 = redis.get("key2");
    auto val3 = redis.get("key3");
    auto val4 = redis.get("key4");

    cout << "value1:" << val1.value() << endl;
    cout << "value2:" << val2.value() << endl;
    cout << "value3:" << val3.value() << endl;

    // optional类型可以隐式转换为bool类型
    if (val4)
        cout << "value4:" << val4.value() << endl;
}

// exist
void test2(sw::redis::Redis &redis)
{
    redis.flushall();
    redis.set("key1", "111");

    auto ret1 = redis.exists("key1");
    auto ret2 = redis.exists("key2");
    cout << ret1 << endl;
    cout << ret2 << endl;

    redis.set("key3", "333");

    auto ret = redis.exists({"key1", "key2", "key3"});
    cout << ret << endl;
}

// delete
void test3(sw::redis::Redis &redis)
{
    redis.flushall();
    redis.set("key1", "111");
    redis.set("key2", "222");

    auto ret = redis.del({"key1", "key2", "key3"});
    cout << ret << endl;
    ret = redis.exists({"key1", "key2", "key3"});
    cout << ret << endl;
}

void test4(sw::redis::Redis &redis)
{
    redis.flushall();
    redis.set("key1", "111");
    redis.set("key2", "222");
    redis.set("key3", "333");
    redis.set("key4", "444");

    // keys命令的第二个参数是一个“插入迭代器”，用于把结果写入容器
    vector<string> result;
    // 类型是back_insert_iterator
    auto it = back_inserter(result);
    redis.keys("*", it);
    PrintContainer(result);
}

void test5(sw::redis::Redis &redis)
{
    redis.flushall();
    redis.set("key", "111");
    redis.expire("key", std::chrono::seconds(10));

    // 使用标准库函数代替系统函数，3s为字面值常量
    std::this_thread::sleep_for(3s);

    auto time = redis.ttl("key");
    cout << time << endl;
}

void test6(sw::redis::Redis &redis)
{
    redis.flushall();

    redis.set("key1", "111");
    string result = redis.type("key1");
    cout << "key1: " << result << endl;

    redis.lpush("key2", "111");
    result = redis.type("key2");
    cout << "key2: " << result << endl;

    redis.hset("key3", "field1", "value1");
    result = redis.type("key3");
    cout << "key3: " << result << endl;

    redis.sadd("key4", "aaa");
    result = redis.type("key4");
    cout << "key4: " << result << endl;

    redis.zadd("key5", "吕布", 99);
    result = redis.type("key5");
    cout << "key5: " << result << endl;
}

int main()
{
    sw::redis::Redis redis("tcp://127.0.0.1:6379");
    // test1(redis);
    // test2(redis);
    // test3(redis);
    // test4(redis);
    // test5(redis);
    test6(redis);
}